class Solution {
public:
/* 贪心策略：在数组中越靠前（索引越小）的数字要尽可能小，所以我们要在条件允许的范围内尽可能的维护一个单调递增序列 */
    string removeKdigits(string num, int k) {
        string result;
        for (int i = 0; i < num.size(); ++i) {
            /* 在允许删除字符数量的范围内，如果遇到违反了序列单调性的新数据（新数据小于最后一个数据），就弹出栈中所有
                大于新数据的数据，然后再插入新数据，以保持栈的单调性 */
            while (!result.empty() && k && result.back() > num[i]) {
                result.pop_back();
                --k;
            }
            result.push_back(num[i]);
        }
        /* 如果遍历结束而没有删除足够多的数据，则把数组中靠后（索引大）的数字删除，由于数组的单调性，越靠后的数字越大 */
        for (;k > 0; --k) {
            result.pop_back();
        }
        /* 特殊情况1：数字有前置0，删除之 */
        while (!result.empty() && result.front() == '0') {
            result.erase(0, 1);
        }
        /* 特殊情况2：结果为空，则返回0 */
        if (result.empty()) {
            result.push_back('0');
        }
        return result;
    }
};